package com.ce.util;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.omg.CORBA.portable.ApplicationException;

import com.ce.framework.context.FrameworkContext;
import com.ce.framework.datamaintain.logic.IBaseLogic;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.DateUtil;
import com.ce.framework.util.LogUtil;
import com.ce.framework.util.StringUtil;
import com.ce.sys.dict.dao.po.SysDictItem;

/**
 * 嫦娥软件有限公司 版权所有 2013
 * 创建人： andy
 * 创建时间： 2013-9-19 下午02:40:28
 * 功能描述：通用工具包，用于查询字典表或者其他等公用信息的工具类
 * ==================================
 * 修改历史
 * 修改人        修改时间      修改位置（函数名）
 *
 * ==================================
 */
public class DictUtil {

	private static IBaseLogic baseLogic;
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-19 下午02:49:01
	 * 功能描述：根据字典表的名称获取该字典项目的包含属性
	 * 方法的参数和返回值
	 * @param dictName 字典项目名称
	 * @return
	 * @throws AppException
	 * @throws ApplicationException
	 * List 返回对象为SysDictItem(字典子表信息)
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	@SuppressWarnings("unchecked")
	public static List<SysDictItem> getDictListByName(String dictName)throws AppException{
		List<SysDictItem> dictItemList = new ArrayList<SysDictItem>();
		if(baseLogic==null)baseLogic = (IBaseLogic)FrameworkContext.getBean("baseLogic");
		dictItemList = (List<SysDictItem>) baseLogic.searchByHql("from SysDictItem t where t.vcMId = (select m.vcId from SysDictM m where m.vcDelFlag=0 and m.vcName ='"+dictName+"' ) and t.vcDelFlag = 0 order by t.nseq asc,t.vcItemName,t.vcId");
		return dictItemList;
	}

	/**
	 * 开发人： andy
	 * 开发时间： 2013-6-9 上午09:26:39
	 * 功能描述：根据字典表的名称获取该字典项目的键值对
	 * 方法的参数和返回值
	 * @param dictName 字典项目名称
	 * @return	Map中为Number和Name和键值对
	 * @throws AppException
	 * @throws ApplicationException
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static Map<String,String> getDictMapByName(String dictName)throws AppException{
		List<SysDictItem> dictItemList = getDictListByName(dictName);
		Map<String,String> map = new LinkedHashMap<String,String>();
		for(SysDictItem item:dictItemList){
			map.put(item.getVcItemNumber(), item.getVcItemName());
		}
		return map;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-26 上午09:33:27
	 * 功能描述：根据字典表中属性值及字典表所属分类名称获取该属性值对应的属性名称
	 * 方法的参数和返回值
	 * @param dictValue  属性值--对应字典子表的vcItemNumber属性
	 * @param dictName  属性分类名称--对应字典主表的vcName属性
	 * @return  SysDictItem 字典子表对象
	 * @throws AppException
	 * 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static SysDictItem getDictItemByValueAndDictName(String dictValue,String dictName)throws AppException{
		SysDictItem dict = null;
		if(baseLogic==null)baseLogic = (IBaseLogic)FrameworkContext.getBean("baseLogic");
		List<?> dictItemList = baseLogic.searchByHql("from SysDictItem t where t.vcItemNumber = '"+dictValue+"' and t.vcDelFlag = 0 and  t.vcMId = (select m.vcId from SysDictM m where m.vcDelFlag=0 and m.vcName ='"+dictName+"' )");
		if(dictItemList!=null&&dictItemList.size()>0)
			dict = (SysDictItem) dictItemList.get(0);
		return dict;
	}

	/**
	* 开发人：andy
	* 开发日期: 2012-5-2  下午4:49:28
	* 功能描述: 根据字典表中属性值及字典表所属分类名称获取该属性值对应的属性名称
	* 方法的参数和返回值: 
	* @param dictValue
	* @param dictName
	* @return
	* @throws AppException
	*/
	public static String getDictNameByValueAndDictName(String dictValue,String dictName)throws AppException{
		SysDictItem dict = getDictItemByValueAndDictName(dictValue, dictName);
		return dict==null?null:dict.getVcItemName();
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-9-27 下午04:17:30
	 * 功能描述：根据字典项目名称生成用于页面select下拉框中option的html代码(该函数一般在编辑页面中使用)
	 * 方法的参数和返回值
	 * @param dictName 属性分类名称--对应字典主表的vcName属性
	 * @return  返回形如"<option value=''><option><option value='1'>项目1<option><option value='2'>项目2<option>"的字符串
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static String getDictOptionsHTML(String dictName)throws AppException{
		StringBuffer op = new StringBuffer("<option value=''></option>");
		List<?> dictItemList = DictUtil.getDictListByName(dictName);
		Iterator<?> it = dictItemList.iterator();
		while(it.hasNext()){
			SysDictItem dictItem = (SysDictItem)it.next();
			op.append("<option value='"+dictItem.getVcItemNumber()+"'>"+dictItem.getVcItemName()+"</option>");
		}
		return op.toString();
	}
	
	
	/**
	 * 开发人： 王廷艳
	 * 开发时间： 2013-4-14 下午04:17:30
	 * 功能描述：根据字典项目名称生成用于页面select下拉框中option的html代码
	 *         （注意：该函数一般在查询界面中使用，为保持统一，不建议编辑页面使用。编辑页面应该在action中生成相应的字典项List列表并放入request中，然后在页面中调用）
	 * 方法的参数和返回值
	 * @param dictName 属性分类名称--对应字典主表的vcName属性
	 * @param emptyChooseStr 空白选择项的项目名称，为空时，该空白项项不显示
	 * @return  返回形如"<option value=''><option><option value='1'>项目1<option><option value='2'>项目2<option>"的字符串
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public static String getDictOptionsHTML(String dictName,String emptyChooseStr)throws AppException{
		StringBuffer op = new StringBuffer();
		if(StringUtil.isNotBlank(emptyChooseStr))
		    op.append("<option value=''>"+emptyChooseStr+"</option>");
		else
			op.append("<option value=''></option>");
		List<?> dictItemList = DictUtil.getDictListByName(dictName);
		Iterator<?> it = dictItemList.iterator();
		while(it.hasNext()){
			SysDictItem dictItem = (SysDictItem)it.next();
			op.append("<option value='"+dictItem.getVcItemNumber()+"'>"+dictItem.getVcItemName()+"</option>");
		}
		return op.toString();
	}
	/**
	 * 开发人： andy
	 * 开发时间： 2012-11-07 16:16
	 * 获得字典项的类JSON格式的转码字符串，返回格式如：val1:text1,val2:text2
	 * @param dictName
	 * @return
	 * @throws AppException
	 */
	public static String getDictSelectStr(String dictName)throws AppException{
		StringBuffer op = new StringBuffer();
		List<?> dictItemList = DictUtil.getDictListByName(dictName);
		Iterator<?> it = dictItemList.iterator();
		while(it.hasNext()){
			SysDictItem dictItem = (SysDictItem)it.next();
			op.append(","+dictItem.getVcItemNumber().replaceAll(",", "&#44;").replaceAll(":", "&#58;")+":"+dictItem.getVcItemName().replaceAll(",", "&#44;").replaceAll(":", "&#58;"));
		}
		return op.length()>0?op.substring(1):"";
	}
	
	public static String getReportDateBegin(String dictName,String defau){
		try {
			SysDictItem item = DictUtil.getDictItemByValueAndDictName("开始日期", "统计报表起止日期设置_"+dictName);
			if(item!=null){
				String begin = item.getVcItemName();
				return DateUtil.format(parseMyDate(begin));
			}
		} catch (Exception e) {
			LogUtil.logError(e);
		}
		return defau!=null?defau:DateUtil.format(new Date());
	}
	public static String getReportDateEnd(String dictName,String defau){
		try {
			SysDictItem item = DictUtil.getDictItemByValueAndDictName("结束日期", "统计报表起止日期设置_"+dictName);
			if(item!=null){
				String begin = item.getVcItemName();
				return DateUtil.format(parseMyDate(begin));
			}
		} catch (Exception e) {
			LogUtil.logError(e);
		}
		return defau!=null?defau:DateUtil.format(new Date());
	}
	private static Date parseMyDate(String str){
		Calendar c = Calendar.getInstance();
		if(str.indexOf("#")>0&&str.indexOf("|")>0){
			String[] ary = str.split("#|\\|");
			if("0".equals(ary[0])){//按日
				c.add(Calendar.DAY_OF_MONTH, -Integer.parseInt(ary[2]));
			}
			else if("1".equals(ary[0])){//按周
				c.add(Calendar.DAY_OF_MONTH, -(Integer.parseInt(ary[1])*7+c.get(Calendar.DAY_OF_WEEK)-Integer.parseInt(ary[2])));
			}
			else if("2".equals(ary[0])){//按月
				c.add(Calendar.MONTH, -Integer.parseInt(ary[1]));
				int day = Math.min(DateUtil.getDays(c.get(Calendar.YEAR), c.get(Calendar.MONTH)),Integer.parseInt(ary[2]));
				c.set(Calendar.DAY_OF_MONTH, day);
			}
			else if("3".equals(ary[0])){//按季
//				c.add(Calendar.DAY_OF_MONTH, -(Integer.parseInt(ary[1])*7+d.getDay()-Integer.parseInt(ary[2])));
			}
			else if("4".equals(ary[0])){//按年
				c.add(Calendar.YEAR, -Integer.parseInt(ary[1]));
				try {
					return DateUtil.parse(DateUtil.format(c.getTime(),"yyyy-")+ary[2]);
				} catch (ParseException e) {
					LogUtil.logError(e);
				}
			}
		}
		return c.getTime();
	}
}
